package com.example.utils;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.ipfs.api.IPFS;
import io.ipfs.api.MerkleNode;
import io.ipfs.api.NamedStreamable;
import io.ipfs.multihash.Multihash;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
 * IPFS工具类
 */
@Component
public class IPFSUtil {
    private final IPFS ipfs;

    public IPFSUtil() {
//        TODO：有点小问题，最后解决
        ipfs = new IPFS("/ip4/127.0.0.1/tcp/5001");
        connectToIPFS();
    }

    /**
     * 连接到IPFS
     */
    public void connectToIPFS() {
        try {
            ipfs.refs.local();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 添加文件到IPFS
     * @param filePath 文件的路径
     * @return 文件在IPFS中的hash值
     */
    public String addPath(String filePath) {
        try {
            NamedStreamable.FileWrapper file = new NamedStreamable.FileWrapper(new File(filePath));
            MerkleNode addedFile = ipfs.add(file).get(0);
            return addedFile.hash.toString();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 添加字节流到IPFS
     *
     * @param inputStream 输入流
     * @return IPFS上的文件hash
     */
    public String add(InputStream inputStream) throws IOException {
        NamedStreamable.InputStreamWrapper isw = new NamedStreamable.InputStreamWrapper(inputStream);
        Multihash filePointer = ipfs.add(isw).get(0).hash;
        return filePointer.toString();
    }

    /**
     * 通过MultipartFile添加文件到IPFS
     *
     * @param file MultipartFile文件
     * @return IPFS上的文件hash
     */
    public String add(MultipartFile file) throws IOException {
        return add(file.getInputStream());
    }

    /**
     * 添加JSON对象到IPFS
     * @param jsonObject 要上传的JSON对象
     * @return JSON对象在IPFS中的哈希值
     */
    public String addJson(Object jsonObject) {
        try {
            String jsonString = JSON.toJSONString(jsonObject);
            NamedStreamable.ByteArrayWrapper data = new NamedStreamable.ByteArrayWrapper(jsonString.getBytes());
            Multihash filePointer = ipfs.add(data).get(0).hash;
            return filePointer.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 从IPFS获取文件
     * @param userHash 文件在IPFS中的hash值
     * @return 文件的字节数组
     */
    public byte[] getFile(String userHash) {
        try {
            return ipfs.cat(Multihash.fromBase58(userHash));
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}